﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CRCDesktop.org.h1.crcDesktop.business;
using CRCDesktop.org.h1.crcDesktop.basicClasses;
using CRCDesktop.org.h1.crcDesktop.util;

namespace CRCDesktop.org.h1.crcDesktop.comunicacao
{
    public class ThreadListeningSensor
    {
        private volatile bool listeningPause;
        private volatile ClienteSocket clienteSocket;
        private volatile ControleDispositivo controleDispositivo;
        private volatile ControleConfig controleConfig;

        private ClienteWS clienteWS;

        private volatile int statusAtual;
        private volatile int statusNormal;

        private Config config;

        private volatile bool ativar;
        private volatile bool desativar;

        public ThreadListeningSensor()
        {
            listeningPause = false;
            this.controleConfig = new ControleConfig();
            this.config = this.controleConfig.consultarConfig();
            this.clienteWS = new ClienteWS();

           
            //this.statusNormal = (int)Math.Pow(2, portasSensor);

            ativar = false;
            //desativar = true;
        }

        public void listening()
        {
            while (!ListeningPause)
            {
                try
                {
                    if (ClienteSocket != null)
                    {

                        for (int i = 0; i < config.Dispositivos.Length; i++ )
                        {
                            //Define o status normal do Dispositivo
                            int portasSensor = 0;
                            this.statusNormal = 0;
                            for (int j = 0; j < config.Sensores.Length / 2; j++)
                            {
                                for (int w = 0; w < 1; w++)
                                {
                                    // Se o sensor estiver associado ao dispositivo analizado...
                                    if(config.Sensores[j,1].Equals(config.Dispositivos[i].ToString())){
                                        portasSensor += Int32.Parse(config.Sensores[j, w]);
                                        this.statusNormal += (int)Math.Pow(2, portasSensor);
                                        portasSensor = 0;
                                    }
                                }
                            }

                            //Retorna valor representando o estado real das portas.
                            statusAtual = (controleDispositivo.getOutPort(config.Dispositivos[i]) - controleDispositivo.getInPort(config.Dispositivos[i]));
                            Console.WriteLine("GetOut: "+controleDispositivo.getOutPort(config.Dispositivos[i]));
                            Console.WriteLine("GetIn: "+controleDispositivo.getInPort(config.Dispositivos[i]));
                            int dif = statusNormal - Math.Abs(statusAtual);


                            dif = Math.Abs(dif);
                            if ((dif) != 0)
                            {
                                ativar = true;
                                Char[] retornoDifBinStr = BibliotecaFuncoes.convertToBinary(dif).ToCharArray();

                                if (ativar)
                                {
                                    int portaAtivada = (int) Math.Log(dif, 2);

                                    for (int x = retornoDifBinStr.Length - 1; x > -1; x--)
                                    {
                                        if (!retornoDifBinStr[x].ToString().Equals("0"))
                                        {
                                            clienteWS.atualizarSensor(config.Dispositivos[i], 8 - x, config.IdCasa, 1);
                                            Console.WriteLine("Sensor da porta: " + (8 - x) + " foi ativado!");

                                            //Configura as portas do Easy Lab que serão saídas.   

                                            this.controleDispositivo.configurarPortaSaida(this.config.Dispositivos, this.config.Sensores);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }

               
            }
        }

        //public void listeningStop()
        //{
        //    ListeningPause = true;
        //}

        public ClienteSocket ClienteSocket
        {
            get { return clienteSocket; }
            set { clienteSocket = value; }
        }

        public bool ListeningPause
        {
            get { return listeningPause; }
            set { listeningPause = value; }
        }

        public ControleDispositivo ControleDispositivo
        {
            get { return controleDispositivo; }
            set { controleDispositivo = value; }
        }

        public Config Config
        {
            get { return config; }
            set { config = value; }
        }
    }
}
